/**
 * 存储管理器
 * 负责游戏数据的保存和读取
 */

import { GAME_CONFIG, INITIAL_BUILDINGS, INITIAL_VILLAGERS } from '../config/game-config.js';

export class StorageManager {
    constructor() {
        this.saveKey = GAME_CONFIG.SAVE_KEY;
    }

    /**
     * 获取初始游戏数据
     * @returns {Object} 初始游戏数据
     */
    getInitialGameData() {
        return {
            resources: {
                wood: GAME_CONFIG.RESOURCES.INITIAL_WOOD,
                food: GAME_CONFIG.RESOURCES.INITIAL_FOOD,
                population: GAME_CONFIG.RESOURCES.INITIAL_POPULATION,
                maxPopulation: GAME_CONFIG.RESOURCES.INITIAL_MAX_POPULATION
            },
            buildings: JSON.parse(JSON.stringify(INITIAL_BUILDINGS)), // 深拷贝
            events: [],
            currentStage: 'survival',
            villagers: JSON.parse(JSON.stringify(INITIAL_VILLAGERS)), // 深拷贝
            lastUpdate: Date.now(),
            consecutiveDays: 1,
            lastLogin: Date.now()
        };
    }

    /**
     * 加载游戏数据
     * @returns {Object|null} 游戏数据，如果不存在则返回null
     */
    loadGameData() {
        try {
            const dataStr = localStorage.getItem(this.saveKey);
            if (dataStr) {
                const data = JSON.parse(dataStr);
                console.log('游戏数据加载成功');
                return data;
            }
        } catch (error) {
            console.error('加载游戏数据失败:', error);
        }
        return null;
    }

    /**
     * 保存游戏数据
     * @param {Object} gameData - 游戏数据
     * @returns {boolean} 是否保存成功
     */
    saveGameData(gameData) {
        try {
            gameData.lastUpdate = Date.now();
            const dataStr = JSON.stringify(gameData);
            localStorage.setItem(this.saveKey, dataStr);
            console.log('游戏数据保存成功');
            return true;
        } catch (error) {
            console.error('保存游戏数据失败:', error);
            return false;
        }
    }

    /**
     * 清除游戏数据
     * @returns {boolean} 是否清除成功
     */
    clearGameData() {
        try {
            localStorage.removeItem(this.saveKey);
            console.log('游戏数据已清除');
            return true;
        } catch (error) {
            console.error('清除游戏数据失败:', error);
            return false;
        }
    }

    /**
     * 导出游戏数据为JSON字符串
     * @param {Object} gameData - 游戏数据
     * @returns {string} JSON字符串
     */
    exportGameData(gameData) {
        try {
            return JSON.stringify(gameData, null, 2);
        } catch (error) {
            console.error('导出游戏数据失败:', error);
            return null;
        }
    }

    /**
     * 从JSON字符串导入游戏数据
     * @param {string} jsonStr - JSON字符串
     * @returns {Object|null} 游戏数据，如果导入失败则返回null
     */
    importGameData(jsonStr) {
        try {
            const data = JSON.parse(jsonStr);
            // 验证数据结构
            if (this.validateGameData(data)) {
                return data;
            } else {
                console.error('游戏数据格式不正确');
                return null;
            }
        } catch (error) {
            console.error('导入游戏数据失败:', error);
            return null;
        }
    }

    /**
     * 验证游戏数据结构
     * @param {Object} data - 游戏数据
     * @returns {boolean} 是否有效
     */
    validateGameData(data) {
        // 检查必需的字段
        const requiredFields = ['resources', 'buildings', 'events', 'currentStage', 'villagers'];
        for (const field of requiredFields) {
            if (!data.hasOwnProperty(field)) {
                console.error(`缺少必需字段: ${field}`);
                return false;
            }
        }

        // 检查resources字段
        const requiredResources = ['wood', 'food', 'population', 'maxPopulation'];
        for (const resource of requiredResources) {
            if (!data.resources.hasOwnProperty(resource)) {
                console.error(`缺少资源字段: ${resource}`);
                return false;
            }
        }

        return true;
    }

    /**
     * 检查是否有存档
     * @returns {boolean} 是否存在存档
     */
    hasSaveData() {
        return localStorage.getItem(this.saveKey) !== null;
    }
}
